package net.lulihu.common_util.jdbc;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.concurrent.TimeUnit;

/**
 * 数据库配置参数
 * <p>
 * 默认使用 HikariCP作为数据库连接池，如果使用请引用 HikariCP 的依赖如下
 * <pre>
 *   <dependency>
 *     <groupId>com.zaxxer</groupId>
 *     <artifactId>HikariCP</artifactId>
 *     <version>2.7.9</version>
 *  </dependency>
 * </pre>
 * <p>
 * 或者可以实现 {@linkplain DataSourceOperational} 自定义数据源初始化
 */
@Data
@NoArgsConstructor
public class DatabaseConfig {

    /**
     * 是否设置为默认数据源
     */
    private boolean defaultDataSource = false;

    /**
     * 驱动程序全类名
     */
    private String driverClassName;

    /**
     * 数据库地址
     */
    private String url;

    /**
     * 账号
     */
    private String username;

    /**
     * 密码
     */
    private String password;


    /**
     * 最大活跃连接
     */
    private int maxActive = 20;

    /**
     * 最小活跃连接
     */
    private int minIdle = 10;


    /**
     * 此属性控制数据库连接池中连接的最大超时毫秒数。
     * 如果在没有连接可用的情况下超过此时间，将抛出SQLException。
     * 最低可接受连接超时为250毫秒。
     * 默认值：10秒
     */
    private long connectionTimeout = TimeUnit.SECONDS.toMillis(10);


    /**
     * 此属性控制允许连接在连接池中最长空闲时间。
     * 此设置仅在minimumIdle定义为小于maximumPoolSize时适用。
     * 一旦池达到minimumIdle连接，空闲连接将不会退出。
     * 连接是否空闲，最大变化为+30秒，
     * 和平均变化+15秒。 在此超时之前，连接永远不会被空闲。
     * 值为0表示永远不会从池中删除空闲连接。 允许的最小值为10000毫秒（10秒）。
     * 默认值：600000（10分钟）
     */
    private long idleTimeout = TimeUnit.MINUTES.toMillis(10);


    /**
     * 此属性控制连接池中连接的最长生命周期。 永远不会使用正在使用的连接退休， 只有当它关闭时才会被删除。
     * 在逐个连接的基础上，轻微的衰减以避免池中的大量灭绝。
     * 我们强烈建议您设置此值应比任何数据库或基础设施施加的连接时间限制短几秒。
     * 0表示没有最大寿命（无限寿命）
     * 默认值：1800000（30分钟）
     */
    private long maxLifetime = TimeUnit.MINUTES.toMillis(30);


    /**
     * 如果您的驱动程序支持JDBC4，我们强烈建议您不要设置此属性。
     * 这适用于不支持JDBC4 Connection.isValid（）API的“遗留”驱动程序。
     * 这是在从池中给出连接之前执行的查询，以验证与数据库的连接是否仍然存在。
     * 再次尝试运行没有此属性的池，如果您的驱动程序不符合JDBC4，
     * HikariCP将记录错误以通知您。 默认值：无
     */
    private String connectionTestQuery;

    /**
     * 连接池名称
     */
    private String poolName;


}